/**
 *  一句话思路：高精度
    算法描述：高精度乘 和 高精度加
    解决所需数据结构+算法：
**/
#include<iostream>
#include<cstring>
using namespace std;

/** 
 * n的范围是50，求50阶乘的和的位数，即求lg(50!) = lg(1) + lg(2) + ... + lg(50)
 * 因为 lg(50) < 2
 * 所以 lg(1) + lg(2) + ... + lg(50) < 100
 * 因此高精度的长度设为100
*/
int a[55][100]; // 存放最终结果
int b[55][100]; // 存放阶乘结果
int al = 0, bl = 0;

int main() {
    int n;
    cin >> n;
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    b[0][1] = 1;

    // i表示轮数、j表示位数
    for(int i=1; i<=n; i++) {
        int add = 0;
        for(int j=1; j<=100; j++) {
            b[i][j] = (b[i-1][j] * i + add) % 10;
            add = (b[i-1][j] * i + add) / 10;

            if(b[i-1][j] * i > 9) {
                
            }
        }

        int ad = 0;
        for(int j=1; j<=100; j++) {
            a[i][j] = (a[i-1][j-1] + b[i][j] + ad) % 10;
            ad = (a[i-1][j-1] + b[i][j] + ad) / 10;
        }
    }

    for(int i=100; i>=1; i--)   cout << b[n][i] << " ";


    // bool flag = false;
    // for(int i=100; i>=1; i--) {
    //     while(!flag && !a[n][i])    i--;
    //     flag = true;
    //     cout << a[n][i] << " ";
    // }
    
    return 0;
}